﻿//参考资料https://www.bilibili.com/read/cv6383390
//参考资料https://blog.csdn.net/qq_38275140/article/details/86707141
//https://blog.csdn.net/u013746357/article/details/107477995
Shader "UrpTest/001URPUnlitShader"
{
    Properties
    {
        _MainTex("MainTex",2D)="White"{}
        _BaseColor("BaseColor",Color)=(1,1,1,1)
    }

    SubShader
    {
        Tags {
            "RenderPipeline"="UniversalRenderPipeline"
            "RenderType"="Opaque"
        }

        // HLSLINCLUDE -- ENDHLSL 这种写法代表区域内的所有声明复制到每个pass里面，这样只需要写一次
        HLSLINCLUDE

        //引用urp必须的hlsl
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

        // CBUFFER_START和CBUFFER_END,对于变量是单个材质独有的时候建议放在这里面，以提高性能。
        // CBUFFER(常量缓冲区)的空间较小，不适合存放纹理贴图这种大量数据的数据类型，
        // 适合存放float，half之类的不占空间的数据，关于它的官方文档在下有详细说明。
        // https://blogs.unity3d.com/2019/02/28/srp-batcher-speed-up-your-rendering/
        CBUFFER_START(UnityPerMaterial)
        float4 _MainTex_ST;
        half4 _BaseColor;
        CBUFFER_END


        TEXTURE2D (_MainTex); // 定义纹理
        SAMPLER(sampler_MainTex); // 定义纹理对应的采样器
        //a2v 中 a 表示应用，v 表示顶点着色器。a2v的意思是把数据从应用阶段传递到顶点着色中。
        // 从应用程序传递到顶点函数的语义---a2v
        // ●POSITION 顶点坐标（模型空间下）
        // ●NORMAL 法线（模型空间下）
        // ●TEXCOORD0~n 纹理坐标
        // ●COLOR 顶点颜色

        // 从顶点函数传递到片元函数的语义---v2f
        // ●SV_POSITION 剪裁空间中的顶点坐标（一般是系统使用）
        // ●COLOR0 可以传递一组值 4个
        // ●COLOR1 可以传递一直值 4个
        // ●TEXCOORD0~n 传递纹理坐标

        // 然后把片元函数传递给系统
        // ●SV_Target 颜色值，显示到屏幕上的颜色
        
        struct a2v
        {
            float4 positionOS:POSITION;
            float4 normalOS:NORMAL;
            float2 texcoord:TEXCOORD;
        };

        struct v2f
        {
            float4 positionCS:SV_POSITION;
            float2 texcoord:TEXCOORD;
        };

        ENDHLSL

        pass
        {
            //在每个pass中需要用 HLSLPROGRAM - ENDHLSL把代码包起来才可以正常使用
            HLSLPROGRAM

            //定义片元顶点着色器
            #pragma vertex VERT
            #pragma fragment FRAG

            // TransformObjectToWorld(positionOS.xyz);// 将顶点模型空间到世界空间
            // TransformObjectToHClip(positionOS.xyz);// 将顶点模型空间到齐次裁剪空间
            // TransformObjectToWorldNormal(normalOS.xyz);// 将法线从模型空间转换到世界空间
            // TransformObjectToWorldDir(tangentOS.xyz);// 将向量从模型空间转换到世界空间
            v2f VERT(a2v i)
            {
                v2f o;
                o.positionCS=TransformObjectToHClip(i.positionOS.xyz);
                //简单来说，TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算， 确保材质球里的缩放和偏移设置是正确的。 （v.texcoord就是顶点的uv）
                o.texcoord=TRANSFORM_TEX(i.texcoord,_MainTex);
                return o;
            }

            // 贴图的采用输出函数采用DXD11 HLSL下的 SAMPLE_TEXTURE2D(textureName, samplerName, coord2) ，
            // 具有三个变量，分别是TEXTURE2D (_MainTex)的变量和SAMPLER(sampler_MainTex)的变量和uv，
            // 用来代替原本DXD9的TEX2D(_MainTex,texcoord)。
            half4 FRAG(v2f i):SV_TARGET
            {
                half4 tex=SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.texcoord)*_BaseColor;
                return tex;
            }

            ENDHLSL
        }
    }
}